_monitor(philosopheM)
   op PrendreBaguette(numPhilosophe: int), RedonnerBaguette(numPhilosophe: int) 

_body(philosopheM)
   const NOMBRE_PHILOSOPHE := 5
   var baguette[0:NOMBRE_PHILOSOPHE-1]: bool := ([NOMBRE_PHILOSOPHE] true)
   _condvar1(BAGUETTE_LIBRE,0:NOMBRE_PHILOSOPHE-1)

   _proc( PrendreBaguette(numPhilosophe) )
      var premierIndice : int, secondIndice : int
      if numPhilosophe % 2 = 0 -> premierIndice := ((numPhilosophe + 1) % NOMBRE_PHILOSOPHE)
		[] numPhilosophe % 2 = 1 -> premierIndice :=  numPhilosophe 
		fi
		
		if numPhilosophe % 2 = 0 -> secondIndice := numPhilosophe
		[] numPhilosophe % 2 = 1 -> secondIndice := ((numPhilosophe + 1) % NOMBRE_PHILOSOPHE)
		fi

      if not baguette[premierIndice] ->
         _wait(BAGUETTE_LIBRE[premierIndice])
      fi
      baguette[premierIndice] := false
      
      if not baguette[secondIndice] ->
         _wait(BAGUETTE_LIBRE[secondIndice])
      fi
      baguette[secondIndice] := false
   _proc_end

   _proc( RedonnerBaguette(numPhilosophe) )
      baguette[ (numPhilosophe + 1) % NOMBRE_PHILOSOPHE] := true
      baguette[ numPhilosophe] := true
      _signal(BAGUETTE_LIBRE[ (numPhilosophe + 1) % NOMBRE_PHILOSOPHE])
      _signal(BAGUETTE_LIBRE[ numPhilosophe])
   _proc_end

_monitor_end

